package com.groupYLP.CouponNexus.merchant.admin.service.basics.log;

import cn.hutool.core.util.StrUtil;
import com.groupYLP.CouponNexus.merchant.admin.common.context.UserContext;
import com.groupYLP.CouponNexus.merchant.admin.dao.entity.CouponTemplateLogDO;
import com.groupYLP.CouponNexus.merchant.admin.dao.mapper.CouponTemplateLogMapper;
import com.mzt.logapi.beans.LogRecord;
import com.mzt.logapi.context.LogRecordContext;
import com.mzt.logapi.service.ILogRecordService;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Service;

import java.util.List;
import java.util.Optional;

/**
 * 日志记录服务实现类，专注于数据库日志记录
 * 该类使用了Lombok的@RequiredArgsConstructor注解来自动注入构造函数依赖项
 * 这种方式减少了显式构造函数的需要，使代码更加简洁
 */
@Slf4j
@Service
@RequiredArgsConstructor
public class DBLogRecordServiceImpl implements ILogRecordService {

    // 注入优惠券模板日志映射器，用于与数据库交互
    private final CouponTemplateLogMapper couponTemplateLogMapper;

    /**
     * 记录日志信息
     * 根据日志记录的类型，执行相应的日志记录操作
     * 目前只支持"CouponTemplate"类型的日志记录
     *
     * @param logRecord 日志记录对象，包含日志信息
     */
    @Override
    public void record(LogRecord logRecord) {
        switch (logRecord.getType()) {
            case "CouponTemplate" : {
                // 构建优惠券模板日志数据对象，并插入到数据库中
                CouponTemplateLogDO couponTemplateLogDO = CouponTemplateLogDO.builder()
                        .couponTemplateId(logRecord.getBizNo())
                        .shopNumber(UserContext.getShopNumber())
                        .operatorId(UserContext.getUserId())
                        .operationLog(logRecord.getAction())
                        .originalData(Optional.ofNullable(LogRecordContext.getVariable("originalData")).map(Object::toString).orElse(null))
                        .modifiedData(StrUtil.isBlank(logRecord.getExtra()) ? null : logRecord.getExtra())
                        .build();
                couponTemplateLogMapper.insert(couponTemplateLogDO);

            }
        }
    }

    /**
     * 查询日志记录
     * 该方法目前未实现，预留接口供将来使用
     *
     * @param bizNo 业务编号
     * @param type 日志类型
     * @return 日志记录列表
     */
    @Override
    public List<LogRecord> queryLog(String bizNo, String type) {
        return List.of();
    }

    /**
     * 根据业务编号和子类型查询日志记录
     * 该方法目前未实现，预留接口供将来使用
     *
     * @param bizNo 业务编号
     * @param type 日志类型
     * @param subType 子类型
     * @return 日志记录列表
     */
    @Override
    public List<LogRecord> queryLogByBizNo(String bizNo, String type, String subType) {
        return List.of();
    }
}

